import { createStore } from 'redux';
import _ from '../assets/utils';

/**
 * redux核心概念
 * 1.Store存储：
 * 整个应用的状态存储在一个单一的 JavaScript 对象中（称为 store）
 * 一个应用只有一个 store
 * 通过 createStore() 函数创建
 * 
 * 2.State状态：
 * 存储的数据称为状态（state）。状态是只读的，唯一改变状态的方式是触发 action
 *  
 */
// 管理员：修改STORE容器的公共状态
let initial={
    supNum:10,
    oppNum:5,
}

/**
 * 5. Dispatch（分发）
 * 唯一改变 state 的方法
 * tore.dispatch(action) 发送 action 到 reducer
 */
const reducer = function reducer(state = initial, action) {
    //防止直接操作原始状态对象向
    state = _.clone(true, state);
    let { type, payload = 1 } = action;
    switch (type) {
        case 'VOTE_SUP':
            state.supNum += payload;
            break;
        case 'VOTE_OPP':
            state.oppNum += payload;
            break;
        default:
    }
    return state;
};

/**
 * 4. Reducers（归约器）
 * 纯函数，接收当前 state 和 action，返回新 state
 * 不能直接修改 state，必须返回新的 state 对象
 * 可以组合多个 reducer
 */
// 创建容器
const store = createStore(reducer);

/**
 * 3.Acions动作
 * 描述发生了什么的对象
 * 必须有 type 属性（通常定义为字符串常量）
 * 可以包含其他数据（称为 payload）
 */


store.dispatch(
    {
        type:'VOTE_SUP',
        step:10,
        payload:1
    }
)

export default store;